前幾天我們介紹了 Vault 的基本架構,也了解了 Root Token、Seal / Unseal 等概念。
但講了這麼多,Vault 到底要怎麼拿來「存密碼」?
今天就來建立我們在 Vault 裡的第一個 Secret。
Vault 並不是單純把所有帳號密碼直接存進某張資料表,而是透過 Secrets Engine 管理不同類型的 Secrets。
而 HashiCorp Vault 支援相當多種類的 Secret Engine,舉幾個比較常見的當例子:
至於今天的重頭戲,就是我們要在Vault裡儲存第一組帳號密碼,Grant這邊以最常見的KV為例來進行操作。
首先,run起server後,需要從Server的console output export兩個環境變數,主要是使用Vault CLI時所需要的Https憑證(如果你起的時候沒有用tls就不需要)及Vault所在的位址:
export VAULT_CACERT='xxx'
export VAULT_ADDR='xxx'
執行Vault login登入伺服器
vault login
查看目前已有的Secure engine
vault secrets list

type=kv那個即為key-value enginee,而如果本身沒有建過kv engine則需要輸入以下command:
vault secrets enable -path=secret kv-v2
這裡的:
-path=secret
代表我們把這個 Secrets Engine 掛載在 secret/ 這個路徑底下。
現在我們來存入第一組帳號密碼:
vault kv put secret/myapp \ username=grant \ password=my-secret-password

這代表我們在 secret/myapp 這個位置存入一組 Key-Value。
username = grant
password = my-secret-password
"myapp"可以是任何名稱,可以以此來識別不同應用程式,如果成功,Vault 會顯示 Secret 的相關資訊。
存入之後,下一步當然是要試著把它讀出來啦!
vault kv get secret/myapp

有發現了嗎? 這其實就是之後 Application 與 Vault 整合時非常重要的概念。
我們不再需要把 "password=my-secret-password" 直接 Hard Code 在 Application 裡面或是local的任一檔案,而是讓 Application 經過 Vault Authentication 取得適當權限後,再從指定的 Secret Path 取得需要的 Credential。
把帳號密碼的權責從Application分離出去,統一由Vault進行管理。
如果今天 Password 改變了,也可以再次執行:
vault kv put secret/myapp \ username=grant \ password=new-password

KV Version 2 的一個重要特色,就是支援 Secret Versioning。
也就是說,新資料寫入之後,舊版本並不會立刻消失,仍然支援讀取。
可以透過
vault kv metadata get secret/myapp
查看 Secret 的版本資訊,甚至可以指定讀取舊版本:
vault kv get -version=1 secret/myapp
如果不再需要這組 Secret,可以執行:
vault kv delete secret/myapp
可以看到 deletion_time 已經有時間戳記了!
不過要特別注意,對 KV v2 而言,這個操作主要是將目前版本標記為刪除,並不代表所有歷史資料都立刻被永久清除。
這也是為什麼理解 KV v2 的 Versioning、Delete 與 Destroy 差異很重要。
另外,雖然Vault提供了Web UI介面,但以軟體工程師起家的我還是習慣用Command prompt來操作,若是操作UI的話,應該不難找到對應的button,就先不在文章中介紹囉!